var SVG = "http://www.w3.org/2000/svg";
var XLINK = "http://www.w3.org/1999/xlink";

function buildCircle(cx, cy, r, style) {
	var c = document.createElementNS (SVG, "circle");
	c.setAttributeNS (null, 'cx', cx);
	c.setAttributeNS (null, 'cy', cy);
	c.setAttributeNS (null, 'r', r);
	c.setAttributeNS (null, 'style', style);
	return c;
}
function buildEllipse(cx, cy, rx, ry, style) {
	var o = document.createElementNS (SVG, "ellipse");
	o.setAttributeNS (null, 'cx', cx);
	o.setAttributeNS (null, 'cy', cy);
	o.setAttributeNS (null, 'rx', rx);
	o.setAttributeNS (null, 'ry', ry);
	o.setAttributeNS (null, 'style', style);
	return o;
}
function buildLine(x1, y1, x2, y2, style) {
	var l = document.createElementNS (SVG, "line");
	l.setAttributeNS (null, 'x1', x1);
	l.setAttributeNS (null, 'y1', y1);
	l.setAttributeNS (null, 'x2', x2);
	l.setAttributeNS (null, 'y2', y2);
	p.setAttributeNS (null, 'style', style);
	return l;
}
function buildImage(url) {
	var image = document.createElementNS(SVG, "image");
//    image.setAttribute("preserveAspectRatio", "xMinYMin slice");
	image.setAttributeNS(null, "x", -100);
	image.setAttributeNS(null, "y", -100);
    image.setAttributeNS(null, "width", 200);
    image.setAttributeNS(null, "height", 200);

	image.setAttributeNS(XLINK, "href", url);
    return image;
}
function buildPath(d, style) {
	var p = document.createElementNS (SVG, "path");
	p.setAttributeNS (null, 'd', d);
	p.setAttributeNS (null, 'style', style);
	return p;
}

function hsl(h, s, l) {
    return hsla(h, s, l, 1.0);
}
function hsla(h, s, l, a) {
    h = (h % 360) / 360;

    var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;
    var m1 = l * 2 - m2;

    return RGBtoHex(hue(h + 1/3) * 255,
                    hue(h)       * 255,
                    hue(h - 1/3) * 255);

    function hue(h) {
        h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);
        if      (h * 6 < 1) return m1 + (m2 - m1) * h * 6;
        else if (h * 2 < 1) return m2;
        else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;
        else                return m1;
    }
}
function RGBtoHex(R,G,B) {
	return toHex(R)+toHex(G)+toHex(B)
}
function toHex(n) {
	n = parseInt(n,10);
	if (isNaN(n)) return "00";
	n = Math.max(0,Math.min(n,255));
	return "0123456789ABCDEF".charAt((n-n%16)/16)
	     + "0123456789ABCDEF".charAt(n%16);
}
